#include "daemon_runner.h"
#include "log/log.h"
#include "daemon_sub_process.h"
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>

//运行标志默认1,0则停止启动进程，进入资源释放函数
static running=1;

//创建结构体变量
static SubProcess *sp[SUB_PRO_COUNT]; //ota和app
//创建子进程参数值
static char *cmd[2]={"ota","app"};

//停止子进程的回调函数
void stop_progress_handler(int sig){
    running=0;
}

//启动起动器，创建ota和app子进程，控制流输入输出重定向
int daemon_runner_run(){
    // 将当前进程变成守护进程
    // 参数1：0：将程序的运行目录指定为系统根root目录，1：当前目录
    // 参数2：0：自动关闭标准输入输出，并重定向到/dev/null， 1：不关闭标准输入输出
    daemon(0,1);

    //控制流输入输出到指定文件
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    close(STDIN_FILENO);
    //输入流不需要，指向空
    open("/dev/null",O_RDWR); 
    //输出流指向日志文件(权限644，没有文件则创建，追加)
    open(STD_LOG_FILE_PATH,O_RDWR|O_CREAT|O_APPEND,0644);
    //错误流指向日志文件(权限644，没有文件则创建，追加)
    open(ERR_LOG_FILE_PATH,O_RDWR|O_CREAT|O_APPEND,0644);

    //注册kill信号回调函数
    signal(SIGTERM,stop_progress_handler);

    //初始化子进程结构体
    for(int i=0;i<SUB_PRO_COUNT;i++){
        sp[i]= daemon_sub_process_init(cmd[i]);
    }

    //每3s循环判断子进程是否启动（没启动或错误需要重启）
    while(running){
        for(int i=0;i<SUB_PRO_COUNT;i++){
            daemon_sub_process_checkStart(sp[i]);
        }
        sleep(3);
    }

    //释放资源
    for(int i=0;i<SUB_PRO_COUNT;i++){
        daemon_sub_process_destroy(sp[i]);
    }
    return 0;
}
